/* 
 * File:   JRepository.h
 * Author: johnneyshi
 *
 * Created on 2013年1月6日, 上午8:57
 */

#ifndef JREPOSITORY_H
#define	JREPOSITORY_H
#include "JErrorInfo.h"
#include "JUpdateConflict.h"
#include "JWorkingCopiesFile.h"
#include "JWorkingCopiesDir.h"
#include "JWorkingCopiesBaseFile.h"
#include "JRepositoryFile.h"
#include "IRepository.h"
#include "JRepositoryConfig.h"
#include "JSerialize.h"
#include <string>
#include <list>
#include "JRepositoryOperationResult.h"
#include "JVersionRepository.h"
#include <pthread.h>

class JRepository : public IRepository,public JSerialize
{
public:
    /*这里需要确定一下什么样的条件下，需要新创建一个版本
     * lockType = 0表示是写锁，lockType = 1表示是读锁，这是一次操作的最开始要调用的函数
     */
    JRepositoryOperationResult GetLock(std::string lockType);
    /*这是一次操作最后要调用的函数，在这个函数里面向文件中写*/
    JRepositoryOperationResult ReleaseLock();
    
    JRepositoryOperationResult Add(JFile& _file);
    JRepositoryOperationResult Add(JDir& _dir);
    
    JRepositoryOperationResult Delete(JFile& _file);
    JRepositoryOperationResult Delete(JDir& _dir);
    
    JRepositorySearchResult Search(string _fileName,int _versionID = -1);
    
    JRepositoryOperationResult Modify(JFile& _file1,JFile& _file2);
    JRepositoryOperationResult Modify(JDir& _dir1,JDir& _dir2);
    
    JRepositoryOperationResult CreateAVersion();
    JRepositoryOperationResult OpenAVersion(int _versionID);
    
    JRepository();
    virtual ~JRepository();
    
    int Serialize(JInOutPut& strea,int& allSize);
    int ReSerialize(JInOutPut& strea);
    std::list<JVersionRepository*> listPVersionRepos;
private:
    /*这是从文件中读取到类JRepository，和ReSerialize的区别在于函数内部提供了流*/
    void ReadFromFile();
    /*这是写道文件，和Serialize的区别在于函数内部提供了流*/
    void WriteToFile();
    
    //Serialize begin.
    int currentVersionID;
    //Serialize end.
    //这里序列化，只序列化是要看情况的。如果创建了新的version,那么需要序列化，
    //如果仅仅是对文件进行了查找，那么不许要序列化
    bool isReposModify;
//    static pthread_rwlock_t rwlock_t;
//    static pthread_rwlockattr_t rwlock_arrt_t;
};

#endif	/* JREPOSITORY_H */

